// main.cpp - Entry file to the EDDemo

#include "EDDemo.h"
#include <iostream>

//////////////////////////////////////////////////////////////////
// This is a call back function for glut to be called when a 
// repaint is needed.
//
// Notes:  
//////////////////////////////////////////////////////////////////
void _display(void);

//////////////////////////////////////////////////////////////////
// This is a call back function for glut to be called when there 
// is nothin to do.
//
// Notes:  
//////////////////////////////////////////////////////////////////
void _idle(void);

//////////////////////////////////////////////////////////////////
// This is a call back function for glut to be called when there 
// is a resize of the window.
// Parameters
// int w - The width of the window
// int h - The height of the window 
// 
// Return: void 
// Notes:  
//////////////////////////////////////////////////////////////////
void _reshape(int w, int h);

//////////////////////////////////////////////////////////////////
// This is the call back for glut to be called to handle the menus
// Parameters
// int value - The menu item that was selected.
// 
// Notes:  
//////////////////////////////////////////////////////////////////
void _menu(int value);

//////////////////////////////////////////////////////////////////
// This is the entry point of the program.
//
// Parameter
// int argc
// char **argv
// 
// Returns
// int 
// Notes:  
//////////////////////////////////////////////////////////////////
int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH|GLUT_RGB|GLUT_ALPHA|GLUT_STENCIL);
    glutInitWindowSize(800, 600); 
	glutCreateWindow("EDDemo");

    EDDemo::GetInstance().Initialize();

    int menid = glutCreateMenu(_menu);
    
    glutAddMenuEntry("Quit", 0);

    glutAttachMenu(GLUT_RIGHT_BUTTON);

    glutDisplayFunc(_display);
	glutReshapeFunc(_reshape);
    glutIdleFunc(_idle);

	glutMainLoop();
    return 0;
}

void _display(void)
{   
    EDDemo::GetInstance().Display();
}

void _idle(void)
{
    EDDemo::GetInstance().Idle();
}

void _reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	float aspect = float(w)/float(h);
	glMatrixMode(GL_PROJECTION);
	    glLoadIdentity();
	    gluPerspective(45, aspect, 0.1f, 300);
	glMatrixMode(GL_MODELVIEW);
}

void _menu(int value)
{  
    EDDemo::GetInstance().Menu(value);
}

